package 综合练习题;

import java.util.*;

//UserGraph 类用于表示用户关系图，包含添加好友、查找共同好友和推荐可能认识的人等功能
public class UserGraph {
 // 存储用户关系图的 Map，键是用户，值是该用户的好友集合
 private final Map<User, Set<User>> graph;

 // 构造函数，初始化用户关系图
 public UserGraph() {
     this.graph = new HashMap<>();
 }

 // 添加双向好友关系的方法
 public void addFriendship(User user1, User user2) {
     // 避免用户自己和自己建立好友关系
     if (user1.equals(user2)) {
         return;
     }
     // 如果 user1 不在图中，先为其创建一个空的好友集合，然后将 user2 添加到其好友集合中
     graph.computeIfAbsent(user1, k -> new HashSet<>()).add(user2);
     // 同理，为 user2 进行相同的操作，实现双向好友关系
     graph.computeIfAbsent(user2, k -> new HashSet<>()).add(user1);
 }

 // 获取指定用户的好友列表，返回不可修改的集合
 public Set<User> getFriends(User user) {
     return Collections.unmodifiableSet(graph.getOrDefault(user, Collections.emptySet()));
 }

 // 查找两个用户的共同好友的方法
 public Set<User> findCommonFriends(User user1, User user2) {
     // 获取 user1 的好友集合
     Set<User> friends1 = getFriends(user1);
     // 获取 user2 的好友集合
     Set<User> friends2 = getFriends(user2);
     // 创建一个新的集合，初始化为 user1 的好友集合
     Set<User> commonFriends = new HashSet<>(friends1);
     // 求 commonFriends 和 friends2 的交集，得到共同好友
     commonFriends.retainAll(friends2);
     // 返回不可修改的共同好友集合
     return Collections.unmodifiableSet(commonFriends);
 }

 // 为指定用户推荐可能认识的人的方法
 public Set<User> recommendFriends(User user) {
     // 用于存储可能认识的人的集合
     Set<User> possibleFriends = new HashSet<>();
     // 获取用户的直接好友集合
     Set<User> directFriends = getFriends(user);
     // 遍历用户的直接好友
     for (User friend : directFriends) {
         // 获取直接好友的好友集合
         Set<User> friendsOfFriend = getFriends(friend);
         // 遍历直接好友的好友
         for (User potentialFriend : friendsOfFriend) {
             // 排除用户自身和已经是直接好友的人
             if (!potentialFriend.equals(user) && !directFriends.contains(potentialFriend)) {
                 // 将符合条件的人添加到可能认识的人集合中
                 possibleFriends.add(potentialFriend);
             }
         }
     }
     // 返回不可修改的可能认识的人集合
     return Collections.unmodifiableSet(possibleFriends);
 }
}